package com.ncs.nc.mq;

import com.google.gson.Gson;
import com.ncs.nc.entity.EventDto;
import com.ncs.nc.entity.RabbitDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

/**
 * 创建一个消费者RabbitConsumer, 并采用@RabbitListener注解实现消息的监听功能
 */
@Component
public class RabbitConsumer {
    private static final Logger log=LoggerFactory.getLogger(RabbitConsumer.class);

    //简单文本消息 - 监听接收消息
    @RabbitListener(queues={"${mq.simple.queue}"})
//    @RabbitListener(queues={"local.mq.simple.queue"})
    public void consumeMsg(@Payload byte[] body){
        try {
            String content=new String(body);
            RabbitDto realDto=new Gson().fromJson(content,RabbitDto.class);
            log.info("消息监听成功~监听到简单文本消息:{}",realDto);
        }catch (Exception e){
            log.error("简单文本消息-监听接收消息 - 发生一场：",e);
        }
    }

    //基于FanoutExchange的消息模型 - 队列 1 ~ 监听接收消息
    @RabbitListener(queues = {"${mq.fanout.queue.a.name}"})
//    @RabbitListener(queues={"local.mq.fanout.a.queue"})
    public void consumeFanoutMsgA(@Payload byte[] body){
        try{
            String content=new String(body);
            EventDto dto=new Gson().fromJson(content,EventDto.class);
            log.info("基于FanoutExchange的消息模型 - 队列 1 ~ 监听接收消息 ~ 监听消息：{}",dto);
        }catch(Exception e){
            log.error("基于FanoutExchange的消息模型 -队列 1 ~ 监听接收消息 ~ 发生异常：",e);
        }
    }

    //基于FanoutExchange的消息模型 - 队列 2 ~ 监听接收消息
    @RabbitListener(queues = {"${mq.fanout.queue.b.name}"})
//    @RabbitListener(queues={"local.mq.fanout.b.queue"})
    public void consumeFanoutMsgB(@Payload byte[] body){
        try{
            String content=new String(body);
            EventDto dto=new Gson().fromJson(content,EventDto.class);
            log.info("基于FanoutExchange的消息模型 - 队列 2 ~ 监听接收消息 ~ 监听消息：{}",dto);
        }catch(Exception e){
            log.error("基于FanoutExchange的消息模型 -队列 2 ~ 监听接收消息 ~ 发生异常：",e);
        }
    }

    //基于DirectExchange的消息模型 - 队列 - 监听接收消息
    @RabbitListener(queues = "${mq.direct.queue.name}")
//    @RabbitListener(queues={"local.mq.direct.queue"})
    public void consumeDirectMsgOne(@Payload byte[] body){
        try{
            String content=new String(body);
            EventDto dto=new Gson().fromJson(content,EventDto.class);
            log.info("基于DirectExchange的消息模型 - 队列 ~ 监听接收消息 ~ 监听消息：{}",dto);
        }catch (Exception e){
            log.error("基于DirectExchange的消息模型 -队列 ~ 监听接收消息 ~ 发生异常:",e);
        }
    }

    //基于TopicExchange的消息模型 - 队列 - 监听接收消息
    @RabbitListener(queues = "${mq.topic.queue.name}")
//    @RabbitListener(queues={"local.mq.topic.queue"})
    public void consumeTopicMsg(@Payload byte[] body){
        try{
            String content=new String(body);
            EventDto dto=new Gson().fromJson(content,EventDto.class);
            log.info("基于TopicExchange的消息模型 - 队列 ~ 监听接收消息 ~ 监听消息：{}",dto);
        }catch (Exception e){
            log.error("基于TopicExchange的消息模型 -队列 ~ 监听接收消息 ~ 发生异常:",e);
        }
    }

    //监听死信队列消息模型中真正的队列
    @RabbitListener(queues = "${mq.dead.prod.queue.name}")
//    @RabbitListener(queues={"local.mq.dead.prod.queue"})
    public void consumeRealQueue(@Payload byte[] body){
        try{
            String content=new String(body);
            EventDto dto=new Gson().fromJson(content,EventDto.class);
            log.info("死信队列成功监听到消息，内容：{}",dto);
        }catch (Exception e){
            log.error("死信队列成功监听到消息 ~ 发生异常:",e);
        }
    }

    //监听死信队列消息模型中真正的队列
    @RabbitListener(queues = "${mq.delay.queue}")
//    @RabbitListener(queues={"local.mq.delay.queue"})
    public void consumeDelayMsg(@Payload byte[] msg){
        try{
            String content=new String(msg,"UTF-8");
            log.info("延时队列-消息监听器-消费者监听到队列的内容：{}",content);
        }catch (Exception e){
            log.error("延时队列-消息监听器-消费者-消息监听到 ~ 发生异常:",e);
        }
    }
}
